#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string>
#include<vector>
#include<aio.h>
// int gval = 100;
// void *threadStart(void *args)
// {
//     while(true){
//         std::cout << "new thread running......"<<"pid:"<<getpid()<<std::endl;
//         sleep(1);
        
//         if(rand()% 10 == 1)
//         {
//             int *p = nullptr;
//             *p = 100;
//         }
//     }
// }
// int main()
// {
//     srand(time(nullptr));
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadStart, (void *)"thread-new");
//     while(true){
//         sleep(1);
//         std::cout << "main thread running......" << "pid:" << getpid() << std::endl;
//     }
//     return 0;
// }

// class ThreadData{
// public:
//     std::string name;
//     int x;
//     int y;
//     ThreadData(std::string name,int x,int y)
//     :name(name)
//     ,x(x)
//     ,y(y)
//     {}
// };
// class ThreadResult{
// public:
//     int x;
//     int y;
//     int result;
// };
// void *start_routine(void *arg)
// {
//     ThreadData* data = (ThreadData*)arg;
//     ThreadResult* rs = new ThreadResult;
//     std::cout << "this is 线程"<<data->name<<"...,my LWP is:" << pthread_self() << std::endl;
//     rs->x = data->x;
//     rs->y = data->y;
//     rs->result = rs->x + rs->y;
//     sleep(1);
//     return (void*)rs;
// }

// std::string PrintToHex(pthread_t& tid)
// {
//     char buffer[64];
//     snprintf(buffer,sizeof(buffer),"0x%lx",tid);
//     return buffer;
// }
// int main()
// {
//     pthread_t tid;//usigned long int
//     ThreadData datain(std::string("new pthread"), 10, 20);
//     int res = pthread_create(&tid, nullptr, start_routine, &datain); // 创建线程
//     if(res!=0)//失败
//     {
//         perror("pthread_create");
//     }
//     else//成功
//     {
//         std::cout << "create success!" << std::endl;
//         std::string tid_str = PrintToHex(tid);
//         std::cout << "tid = " <<tid_str << std::endl;
//     }

//     sleep(2);
//     std::cout << "pthread_join begin..." << std::endl;
//     void *ret = nullptr;
//     res = pthread_join(tid, &ret); // 等待线程
//     if(res != 0)//失败
//     {
//         std::cout << "here" << std::endl;
//         perror("pthread_join");
//     }
//     else//成功
//     {
//         ThreadResult *rs = (ThreadResult *)res;
//         std::cout << "pthread_join success!new thread exit code:" << rs->x << "+" << rs->y << "=" << rs->result << std::endl;
//     }
//     sleep(0);
// }


// class ThreadData{
// public:
//     std::string name;
//     int x;
//     int y;
//     ThreadData(std::string name,int x,int y)
//     :name(name)
//     ,x(x)
//     ,y(y)
//     {}
// };
// class ThreadResult{
// public:
//     int x;
//     int y;
//     int result;
// };
// void *start_routine(void *arg)
// {
//     printf("线程-%sis running\n", (char*)arg);
//     return (void*)arg;
// }

// std::string PrintToHex(pthread_t& tid)
// {
//     char buffer[64];
//     snprintf(buffer,sizeof(buffer),"0x%lx",tid);
//     return buffer;
// }
// int main()
// {
    
    
//     std::vector<pthread_t> tids;
//     // 1.创建线程
//     for (int i = 0; i < 10;i++)
//     {
//         pthread_t tid;//usigned long int
//         char *name  = new char[128];
//         snprintf(name,128, "thread-%d", i);
//         int res = pthread_create(&tid, nullptr, start_routine, name);
//         tids.push_back(tid);
//         if(res!=0)//失败
//         {
//             perror("pthread_create");
//         }
//     // else//成功
//     // {
//     //     //sleep(2);
//     //     // std::cout << "create success!" << std::endl;
//     //     // std::string tid_str = PrintToHex(tid);
//     //     // std::cout << "tid = " <<tid_str << std::endl;
//     // }
//     }
    

//     sleep(2);
//     std::cout << "pthread_join begin..." << std::endl;
//    for(auto tid:tids)
//    {
//        void *name = nullptr;
//        pthread_join(tid, &name);
//        printf("%squit\n", static_cast<const char *>(name));
//    }

//     sleep(0);
// }

__thread int gval = 0;
void *threadStart(void *args)
{
    while(true){
        std::cout << "thread gavl:"<<gval<<std::endl;
        sleep(1);
        gval++;
    }
}
int main()
{
    srand(time(nullptr));
    pthread_t tid;
    pthread_create(&tid, nullptr, threadStart, (void *)"thread-new");
    while(true){
        sleep(1);
        std::cout << "main thread,gval:"<<gval<< std::endl;
    }
    return 0;
}